const App = {
  data() {
    return {
      dialogFormVisible: false,
      dialogForm: {
        selectedWorkbook: "", // 存储选中的工作簿名称
      },
      excelWorkbook: null, // 新增：存储完整的 Excel 工作簿对象（wb）
      workbookList: [], // 存储Excel中的所有工作簿名称（如["sheet1", "sheet2"]）
      formLabelWidth: "120px",
      fileList: [],
      tableData: [],
      form: {
        page: 1,
        limit: 15,
      },
      loading: false,
      success: 0,
      error: 0,
    };
  },
  mounted() {},
  methods: {
    // 返回按钮
    goBack() {
      window.history.back();
    },
    // 选择文件按钮
    handleUpload({ raw }, row) {
      console.log({ raw }, row);
      const that = this;

      // 重新选择文件时重置计数器
      this.success = 0;
      this.error = 0;
      //FileReader获取文件流
      var reader = new FileReader();
      reader.readAsBinaryString(raw);
      reader.onload = function (e) {
        try {
          console.log(e);
          var data = e.target.result;
          var wb = XLSX.read(data, {
            type: "binary", //以二进制的方式读取
          });
          console.log(wb);
          that.excelWorkbook = wb;
          if (wb.SheetNames.length != 1) {
            // 存储工作簿列表并显示弹窗
            that.workbookList = wb.SheetNames;
            that.dialogFormVisible = true; // 显示弹窗
          } else {
            console.log(wb.Sheets);

            console.log(wb.SheetNames[0]);

            // 导入数据
            var sheet = wb.Sheets[wb.SheetNames[0]]; //sheet0代表excel表格中的第一页
            var json = XLSX.utils.sheet_to_json(sheet); //利用接口实现转换。
            console.log(sheet);
            console.log(json);
            that.tableData = json.map((item) => {
              // 1. 处理Excel日期格式（原始数据的“出生日期”是数字，如45917 → 转换为YYYY-MM-DD）
              const convertExcelDate = (excelNum) => {
                if (!excelNum) return ""; // 空值处理
                // Excel日期起点是1900-01-00，需修正1天偏移（Excel的bug）
                const baseDate = new Date(1900, 0, 1);
                baseDate.setDate(baseDate.getDate() + excelNum - 2); // 偏移修正
                // 格式化为YYYY-MM-DD（补0处理，如1月→01）
                return `${baseDate.getFullYear()}-${(baseDate.getMonth() + 1)
                  .toString()
                  .padStart(2, "0")}-${baseDate
                  .getDate()
                  .toString()
                  .padStart(2, "0")}`;
              };
              // 返回一个新对象，使用新的键名
              return {
                ID_Card_Number: item.身份证编号 + "" || "",
                Personal_Name: item.姓名,
                Gender: item.性别,
                Birthday: convertExcelDate(item.出生日期),
                Registered_Residence: item.户籍地,
                RR_Province_Number: item.户籍地归属省编号,
                RR_City_Number: item.户籍地归属市编号,
                RR_County_Nubmer: item["户籍地归属区/县编号"],
                RR_Town_Number: item["户籍地归属乡/镇/街道编号"],
                RR_Village_Number: item.村,
                Political_Affiliation: item.政治面貌,
                Home_Address: item.家庭地址,
                Nation: item.民族,
                Migrant_Personal: item["外来人口 0:户籍人口  1:外来人口"],
                Flow_Personal: item["流动人口 0:否 1:是"],
                // Focus: item["重点关注 0:否 1:是"],
                Contact_Phone: item.联系电话,
                isStatus: "0", // 初始状态：待导入
                Cause: "", // 初始无错误原因
              };
            });
          }
        } catch (err) {
          // 错误提示（使用之前修复的 ElMessageBox）
          ElMessageBox.alert("文件解析错误，请检查格式", "错误", {
            confirmButtonText: "确定",
          });
        }
      };
    },
    confirm() {
      // 选择工作簿后重置计数器
      this.success = 0;
      this.error = 0;

      let wb = this.excelWorkbook;
      var sheet = wb.Sheets[this.dialogForm.selectedWorkbook]; //sheet0代表excel表格中的第一页
      var json = XLSX.utils.sheet_to_json(sheet); //利用接口实现转换。
      console.log(sheet);
      console.log(json);
      this.tableData = json.map((item) => {
        // 1. 处理Excel日期格式（原始数据的“出生日期”是数字，如45917 → 转换为YYYY-MM-DD）
        const convertExcelDate = (excelNum) => {
          if (!excelNum) return ""; // 空值处理
          // Excel日期起点是1900-01-00，需修正1天偏移（Excel的bug）
          const baseDate = new Date(1900, 0, 1);
          baseDate.setDate(baseDate.getDate() + excelNum - 2); // 偏移修正
          // 格式化为YYYY-MM-DD（补0处理，如1月→01）
          return `${baseDate.getFullYear()}-${(baseDate.getMonth() + 1)
            .toString()
            .padStart(2, "0")}-${baseDate
            .getDate()
            .toString()
            .padStart(2, "0")}`;
        };
        // 返回一个新对象，使用新的键名
        return {
          ID_Card_Number: item.身份证编号 + "" || "",
          Personal_Name: item.姓名,
          Gender: item.性别,
          Birthday: convertExcelDate(item.出生日期),
          Registered_Residence: item.户籍地,
          RR_Province_Number: item.户籍地归属省编号,
          RR_City_Number: item.户籍地归属市编号,
          RR_County_Nubmer: item["户籍地归属区/县编号"],
          RR_Town_Number: item["户籍地归属乡/镇/街道编号"],
          RR_Village_Number: item.村,
          Political_Affiliation: item.政治面貌,
          Home_Address: item.家庭地址,
          Nation: item.民族,
          Migrant_Personal: item["外来人口 0:户籍人口  1:外来人口"],
          Flow_Personal: item["流动人口 0:否 1:是"],
          // Focus: item["重点关注 0:否 1:是"],
          Contact_Phone: item.联系电话,
          isStatus: "0", // 初始状态：待导入
          Cause: "", // 初始无错误原因
        };
      });
      console.log(this.tableData);

      // 关闭弹窗
      this.dialogFormVisible = false;
    },
    downloadTemplate() {
      window.location.href = "./download/导入人口数据模版.xls";
    },
    submitUpload(i = 0) {
      // 当i=0时，表示开始新的上传，需要重置状态和计数器
      if (i === 0) {
        console.log("开始新的上传，重置失败记录状态");

        // 重新计算统计数据：基于当前记录状态
        this.success = this.tableData.filter(
          (item) => item.isStatus === "1"
        ).length;
        this.error = 0; // 重置错误计数，因为要重新尝试失败的记录

        // 只重置失败的记录状态，保持成功记录不变
        this.tableData.forEach((item) => {
          if (item.isStatus === "2") {
            // 只重置失败的记录
            item.isStatus = "0"; // 重置为待上传状态
            item.Cause = ""; // 清空失败原因
          }
          // 成功的记录(isStatus === "1")保持不变
        });

        console.log(`已成功：${this.success}条，准备重新上传失败的记录`);
      }

      if (i < this.tableData.length) {
        // 检查当前记录是否已成功上传，若是则直接处理下一条
        if (this.tableData[i].isStatus === "1") {
          console.log(`第${i + 1}条记录已成功，跳过上传`);
          setTimeout(() => this.submitUpload(i + 1), 0);
          return; // 跳过当前记录的后续处理
        }
        console.log(this.tableData[i]);
        this.loading = true;

        // 1. 定义校验规则：字段名 -> 错误提示
        const validateRules = [
          { field: "ID_Card_Number", message: "身份证编号不能为空" },
          { field: "Personal_Name", message: "姓名不能为空" },
          { field: "Gender", message: "性别不能为空" },
          { field: "Birthday", message: "出生日期不能为空" },
          { field: "Political_Affiliation", message: "政治面貌不能为空" },
          { field: "Home_Address", message: "家庭地址不能为空" },
          { field: "Contact_Phone", message: "联系电话不能为空" },
        ];

        // 2. 循环校验规则
        let validatePass = true;
        let errorMessage = "";

        for (const rule of validateRules) {
          if (!this.tableData[i][rule.field]) {
            validatePass = false;
            errorMessage = rule.message;
            break; // 找到第一个不通过的规则就退出
          } else if (rule.field == "ID_Card_Number" && !ID_Validity(this.tableData[i][rule.field])) {
            validatePass = false;
            errorMessage = "身份证号的格式不正确";
            break; // 找到第一个不通过的规则就退出
          } else if (rule.field == "Contact_Phone" && validatemobile(this.tableData[i][rule.field]) ) {
            validatePass = false;
            errorMessage = "手机号的格式不正确";
            break; // 找到第一个不通过的规则就退出
          } else if (rule.field == "Political_Affiliation" && !['群众','无党派人士','民主党派成员','共青团员','中共预备党员','中共党员'].some(x => x == this.tableData[i][rule.field])) {
            validatePass = false;
            errorMessage = "政治面貌不正确";
          }
        }
        console.log(validatePass);

        // 3. 处理校验结果
        if (!validatePass) {
          console.log(errorMessage);

          // 校验不通过
          this.tableData[i].isStatus = "2";
          this.tableData[i].Cause = errorMessage;
          this.error++;
        } else {
          console.log(3231);

          // 添加超时机制防止卡住
          let callbackExecuted = false;
          const timeoutId = setTimeout(() => {
            if (!callbackExecuted) {
              console.log(`第${i + 1}条记录请求超时，继续处理下一条`);
              this.tableData[i].isStatus = "2";
              this.tableData[i].Cause = "网络请求超时";
              this.error++;
              callbackExecuted = true;
              setTimeout(() => this.submitUpload(i + 1), 0);
            }
          }, 10000); // 10秒超时

          this.submitForm(this.tableData[i], (res) => {
            if (callbackExecuted) return; // 防止重复执行
            callbackExecuted = true;
            clearTimeout(timeoutId); // 清除超时计时器

            console.log(res);
            if (res && res.Status === "success") {
              this.tableData[i].isStatus = "1";
              this.success++;
            } else {
              // 无论接口返回什么错误，都标记为失败
              this.tableData[i].isStatus = "2";
              this.tableData[i].Cause =
                (res && res.Message) || "导入失败请检查是否身份证已存在";
              this.error++;
            }
            // 等待服务器回传后再处理下一条数据
            setTimeout(() => this.submitUpload(i + 1), 100);
          });
          return; // 等待回调完成，不继续执行下面的代码
        }

        // 4. 处理下一条数据（用 setTimeout 避免递归栈溢出）
        setTimeout(() => this.submitUpload(i + 1), 0);
      } else if (i !== 0) {
        this.loading = false;
        // 提示信息显示累计的成功/失败总数
        // this.$message.success(
        //   `批量导入结束！累计成功：${this.success}条，累计失败：${this.error}条`
        // );
      } else {
        this.$message({
          message: "请先导入模板后再上传",
          type: "warning",
        });
      }
    },
    submitForm(data, callback) {
      data.Personal_Resource = 0;
      console.log(data);
      let lArray = new Array();
      lArray.push(data);
      let lJSONObject_personal_information = new Object();
      lJSONObject_personal_information.personal_information = lArray; //换表
      let lJSONObject_DataSet = new Object(); // Modify
      lJSONObject_DataSet.Add = lJSONObject_personal_information; //换表
      console.log(lJSONObject_DataSet);

      submitSave(lJSONObject_DataSet, (res) => {
        console.log(res);

        callback(res);
      });
      // $.ajax({
      //   headers: requestHeaders(),
      //   url: `${mh}/generalBusiness/generalSave`,
      //   type: "POST",
      //   data: {
      //     Data: JSON.stringify(lJSONObject_DataSet),
      //   },
      //   success: function (res) {
      //     console.log(res);
      //     //  callback(status);
      //   },
      //   complete: function (XMLHttpRequest) {
      //     callback(XMLHttpRequest.status);
      //   },
      //   dataType: "json",
      // });
    },
    handleChange({ raw }) {
      //导入监听文件
      const that = this;
      var reader = new FileReader();
      reader.readAsBinaryString(raw);
      reader.onload = function (e) {
        var data = e.target.result;
        var wb = XLSX.read(data, {
          type: "binary", //以二进制的方式读取
        });
        var sheet = wb.Sheets[wb.SheetNames[0]]; //sheet0代表excel表格中的第一页
        var json = XLSX.utils.sheet_to_json(sheet); //利用接口实现转换。
        let arr = [];
        json.forEach((item) => {
          arr.push({
            Article_Specifications_SerialNumber: item["规格内码"],
            BarCode: item["条形码"],
            isEdit: false,
            isStatus: "0",
            Cause: "",
          });
        });
        that.tableData = arr;
      };
    },
    handleSizeChange(val) {
      this.form.page = 1;
      this.form.limit = val;
    },
    handleCurrentChange(val) {
      this.form.page = val;
    },
    handleEdit(row) {
      //修改当前行
      row.isEdit = !row.isEdit;
    },
    handleRemove(index) {
      //移除当前行
      this.$confirm("是否要删除此行?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          console.log(index);

          // this.tableData = this.tableData.filter(
          //   (i, id) => id != (this.form - 1) * this.limit + index
          // );
          this.tableData.splice(index, 1);
          console.log(this.tableData);
        })
        .catch((err) => {
          console.log(err);
        });
    },
    handleClean() {
      //清空
      this.$confirm("是否要清空导入数据?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          this.tableData = [];
        })
        .catch(() => {});
    },
  },
};
const { createApp } = Vue;
const app = createApp(App);
//这种方式是引入全部图标，无需单个引入
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component);
}
const ElMessage = ElementPlus.ElMessage;
const alert = ElementPlus.alert;
app.use(ElementPlus, { locale: zhCn });
app.mount("#app");
